package com.atguigu.locks;

import java.util.concurrent.TimeUnit;

class Phone{
    public static synchronized void sendEmail()
    {
        try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {throw new RuntimeException(e);}
        System.out.println(Thread.currentThread().getName());
        System.out.println("Email");
    }

    public  synchronized void sendMassage() {
        System.out.println(Thread.currentThread().getName());
        System.out.println("Massage");
    }

    public void Hello() {
        System.out.println("Hello");
    }
}


public class Lock8Demo {

    static Phone phone = new Phone();
    static Phone phone2 = new Phone();

    public static void main(String[] args) {
        new Thread(()->{phone.sendEmail();},"A").start();
        new Thread(()->{phone.sendMassage();},"B").start();
    }

}
//1 标准访问，请问先打印邮件还是短信(Email  ----  Massage)
//2 邮件方法暂停4秒，请问先打印邮件还是短信(Email  ----  Massage)
/**
 * 在一个对象里如果有多个synchronized的方法，只要有个一个synchronized方法被调用，那么其他synchronized方法都需要等待，
 * 在同一时间内只能有一个线程去访问synchronized方法
 */
//3 新增普通Hello方法，请问先打印邮件还是hello(Hello  ----  Email)
//4 变为两部手机，请问先打印邮件还是短信(Massage ----  Email)
/**
 * 普通方法和同步锁无关
 *换成两个对象，抢的不是同一个锁。
 */
//5 两个静态同步方法，同一部手机，请问先打印邮件还是短信(Email  ----  Massage)
//6 两个静态同步方法，用两部手机，请问先打印邮件还是短信(Email  ----  Massage)
/**
 * 若是静态同步方法，static  Class ，锁住的是唯一的一个模板
 */
//7 一个静态同步方法，一个普通同步方法，用1部手机，请问先打印邮件还是短信
//8 一个静态同步方法，一个普通同步方法，用2部手机，请问先打印邮件还是短信
/**
 * 所有的静态同步方法用的也是同一把锁——类对象本身，就是我们说过的唯一模板Class
 * 具体实例对象this和唯一模板Class，这两把锁是两个不同的对象，所以静态同步方法与普通同步方法之间是不会有竞态条件的。
 * 但是一旦一个静态同步方法获取锁后，其他的静态同步方法都必须等待该方法释放锁后才能获取锁
 */